package gbench.appdemo.myworld.market.commodity;

import java.text.MessageFormat;

import lombok.AllArgsConstructor;

/**
 * 价格就是 一种 物品 相对于 另一种物品的 比率。
 * @author gbench
 *
 */
@AllArgsConstructor
public class Price <X extends Valuable,Y extends Valuable>{
    /**
     * 
     * @param a
     * @param amountA
     * @param b
     * @param amountB
     */
    public  Price(X a,Number na,Y b,Number nb){
        this.a = a;
        this.b = b;
        this.bamount = nb.doubleValue();// 即 amountB 一般等价物的数量
        this.aamount = na.doubleValue();
    }
    
    /**
     * 
     * @param a 目标对象
     * @param b 计价对象
     * @param amount 换算比率 A用b 进行计价的数据。
     */
    public  Price(X a,Y b,Number amount){
        this(a,amount,b,1);
    }
    
    /**
     * A Amount 
     * @return
     */
    public Double ratio() {
        return this.aamount/this.bamount;
    }
    
    /**
     * A Amount 
     * @return
     */
    public Double getAmount() {
        return this.getAAmount();
    }
    
    /**
     * A Amount
     * @return
     */
    public Double getAAmount() {
        return this.aamount;
    }
    
    /**
     * B  Amount
     * @return
     */
    public Double getBAmount() {
        return this.bamount;
    }
    
    /**
     * 计价的商品
     * @return
     */
    public X getUnderlying() {
        return this.a;
    }
    
    /**
     * 获得一般等价物
     * @return
     */
    public Y getUniversalEquivalent() {
        return this.b;
    }
    
    /**
     * 单位
     * @return
     */
    public String getUnitName() {
        return b.getName();
    }
    
    /**
     * 
     */
    public String toString() {
        return MessageFormat.format("{0}:{1,number,#}/{2}:{3,number,#}={4,number,#}",
            this.a,this.aamount,this.b,this.bamount,this.ratio());
    }
    
    public X getA() {
        return a;
    }

    public Y getB() {
        return b;
    }

    private final X a;
    private final Y b;
    private final Double bamount;
    private final Double aamount;
}